package com.netease.premissionstudy.permission.aspect;

import android.content.Context;
import android.util.Log;

import androidx.fragment.app.Fragment;

import com.netease.premissionstudy.permission.MyPermissionActivity;
import com.netease.premissionstudy.permission.annotation.Permission;
import com.netease.premissionstudy.permission.annotation.PermissionCancel;
import com.netease.premissionstudy.permission.annotation.PermissionDenied;
import com.netease.premissionstudy.permission.core.IPermission;
import com.netease.premissionstudy.permission.util.PermissionUtils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * AspectJ 典型的面向切面编程思想  AOP
 * 原理: 在字节码环境中增加字节码以实现控制
 */
@Aspect
public class PermissionAspect {

    /**
     * 切入点 == 我们要监听的注解
     * 参数permission 和 @annotation(permission) 要保持一致
     */
    @Pointcut("execution(@com.netease.premissionstudy.permission.annotation.Permission * *(..)) && @annotation(permission)")
    public void pointActionMethod(Permission permission) {
    }

    /**
     * 由于找打了切入点，就可以对 函数进行环绕
     */
    @Around("pointActionMethod(permission)")
    public void aProceedingJoinPoint(final ProceedingJoinPoint point,
                                     final Permission permission) throws Throwable {
        // 先定义一个上下文操作创建
        Context context = null;
        final Object thisObject = point.getThis();
        // 同学们自我检测，JDK环境到底有没有问题
        if (null == thisObject) {
            Log.d("Erro", "aProceedingJoinPoint: 原来我的JDK环境有问题，导致AspectJ全部失效...");
            return;
        }
        // context初始化
        if (thisObject instanceof Context) {
            context = (Context) thisObject;
        } else if (thisObject instanceof Fragment) {
            context = ((Fragment) thisObject).getActivity();
        }
        // 判断是否为null
        if (null == context || permission == null) {
            throw new IllegalAccessException("null == context || permission == null is null");
        }
        // 真正的逻辑，权限处理逻辑
        final Context finalContext = context;

        // 调用 启用 空Activity 开始各种申请权限了
        MyPermissionActivity.requestPermissionAction(context, permission.value(),
                permission.requestCode(), new IPermission() {
                    @Override
                    public void ganted() {
                        // 申请成功
                        try {
                            point.proceed(); // 被Permission 的函数，正常执行下去，不拦截
                        } catch (Throwable throwable) {
                            throwable.printStackTrace();
                        }
                    }

                    @Override
                    public void cancel() {
                        // 被拒绝
                        // 反射 执行 被 @PermissionCancel注解的函数
                        PermissionUtils.invokeAnnotion(thisObject, PermissionCancel.class);
                    }

                    @Override
                    public void denied() {
                        // 被拒绝（勾选了 不再提醒）
                        // 反射 执行 被 @PermissionDenied注解的函数
                        PermissionUtils.invokeAnnotion(thisObject, PermissionDenied.class);
                        // 用户 被拒绝（勾选了 不再提醒）  非常过激行为， 跳转到手机设置界面，让他明白必须给权限
                        PermissionUtils.startAndroidSettings(finalContext);
                    }
                });
    }
}
